﻿//******************************************************************************
//    Copyright (c) 2013 INFOGRAM Inc. All Right Reserved.
//
//    SystemName   : Training Support System
//    CategoryName : 
//    FileName     : EntityRepository.cs
//    Description  : Base class for all entity data access
//
//    Created By   : 2012.12.20  Vo Viet Khanh
//    Updated By   :
//
//******************************************************************************

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Entity;
using System.Linq;
using TanWeb.Models.Entities;
using TanWeb.Models.Entities.Infrastructure;
using TanWeb.Models.DataAccess;

namespace TanWeb.Models.DataAccess.Infrastructure
{
    /// <summary>
    /// エンティティRepositoryのBaseクラス
    /// </summary>
    /// <typeparam name="T">エンティティ種類</typeparam>
    public class EntityDataAccess<T> : BaseDataAccess
        where T : Entity
    {
        //===============================================================
        //  コンストラクタ等宣言
        //===============================================================
        #region /***    Constructor Destructor Declared    ***/
        /// <summary>
        /// コンストラクタ
        /// </summary>
        /// <param name="dbContext">データベースコンテキスト</param>
        public EntityDataAccess(DbContext dbContext)
            : base(dbContext)
        {
            // DbSetの初期化
            this.DbSet = this.DbContext.Set<T>();
        }
        #endregion

        //===============================================================
        //  プロパティ宣言
        //===============================================================
        #region /***    Propertie Declared    ***/
        /// <summary>
        /// データベースセット
        /// </summary>
        protected DbSet<T> DbSet { get; set; }
        #endregion

        //===============================================================
        //  パブリックメソッド宣言
        //===============================================================
        #region /***    Public Method Declared    ***/
        /// <summary>
        /// エンティティ挿入
        /// </summary>
        /// <param name="entity">挿入用のエンティティ</param>
        public void Insert(T entity)
        {
            // 作成者、作成日時、更新者、更新日時の自動更新
            this.DbSet.Add(entity);
        }

        /// <summary>
        /// エンティティ更新
        /// </summary>
        /// <param name="entity">更新用のエンティティ</param>
        public void Update(T entity)
        {
            // 更新者、更新日時の自動更新
            this.DbSet.Add(entity);
            this.DbContext.Entry<T>(entity).State = EntityState.Modified;
        }

        /// <summary>
        /// エンティティ削除
        /// </summary>
        /// <param name="entity">削除用のエンティティ</param>
        public void Delete(T entity)
        {
            this.DbSet.Remove(entity);
            this.DbContext.Entry<T>(entity).State = EntityState.Deleted;
        }

        /// <summary>
        /// エンティティ一覧を取得する
        /// </summary>
        /// <returns>エンティティ一覧</returns>
        public List<T> GetAll()
        {
            return this.DbSet.ToList<T>();
        }

        /// <summary>
        /// 全てのエンティティを数える
        /// </summary>
        /// <returns>エンティティ数</returns>
        public int Count()
        {
            return this.DbSet.Count<T>();
        }
        #endregion
    }
}
